package com.example.lib_cache.dao;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import com.example.lib_cache.model.User;

import java.util.List;

//标记此接口是操作User这张表的基类
@Dao
public interface UserDao {

    /**
     * 1.如果只是插入数据 ，只需要标记上Insert注解,并指明插入数据
     * 如果已存在一条与主键一样的数据，执行相应策略
     *  REPLACE 直接替换
     *  ABORT   终止操作，并回滚事务，不影响旧的数据
     *  IGNORE  忽略冲突，但是会插入失败
     * @param users
     */

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(User ... users);

    /**
     * 常规查询操作，此时还是需要些sql语句的
     * @param userIds
     * @return
     */
    @Query("SELECT * FROM mine_user WHERE u_id IN (:userIds)")
    List<User> loadAllByIds(int [] userIds);

    /**
     * 高级查询操作，可以通过livedata以观察者的形式获取数据库数据，可以避免
     * 不必要的npe  空指针异常
     * 更重要的是，它可以监听数据库表中数据的变化，一旦发生了 insert update delete
     * room 会自动读取表中最新的数据，发送给UI层，刷新页面
     *
     * @return
     */

    @Query("SELECT * FROM mine_user")
    LiveData<List<User>> queryAllUserLiveData();


    /**
     * 删除操作
     * @param user
     */
    @Delete
    void delete(User user);

    @Update
    void update(User user);
}
